#include <config.h>
#include <input_manager.h>
#include <disp_manager.h>
#include <stdlib.h>
#include <tslib.h>
// 参考下tslib里的print.c

static struct tsdev *g_tTSDev;
static int giXres;
static int giYres;

//  * 函数名称： TouchScreenDevInit
//  * 功能描述： 触摸屏输入模块的设备初始化函数
//  *            注意: 由于要用到LCD的分辨率, 此函数要在SelectAndInitDisplay之后才能调用
//  * 输入参数： 无
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
static int TouchScreenDevInit(void)
{
    char *pcTSName = NULL;
    if (pcTSName = getenv("TSLIB_TSDEVICE") != NULL)
    {
        g_tTSDev = ts_open(pcTSName, 1);
    }
    else
    {
        // 如果没有设置环境变量，就直接打开1号
        g_tTSDev = ts_open("/dev/event0", 1);
    }

    // 如果打开失败
    if (!g_tTSDev)
    {
        DBG_PRINTF(APP_ERR "ts_open error!\n");
        return -1;
    }

    if (ts_config(g_tTSDev))
    {
        DBG_PRINTF("ts_config error!\n");
        return -1;
    }

    if (GetDispResolution(&giXres, &giYres, &iBpp))
    {
        return -1;
    }

    return 0;
}

//  * 函数名称： TouchScreenDevExit
//  * 功能描述： 触摸屏输入模块的设备退出函数
//  * 输入参数： 无
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
static int TouchScreenDevExit(void)
{
    return 0;
}

//  * 函数名称： TouchScreenGetInputEvent
//  * 功能描述： 触摸屏输入模块的读取数据函数,它在触摸屏输入模块的子线程中被调用
//  * 输入参数： 无
//  * 输出参数： ptInputEvent - 内含得到的输入数据
//  * 返 回 值： 0 - 成功, 其他值 - 失败
static int TouchScreenGetInputEvent(PT_InputEvent ptInputEvent)
{
    struct ts_sample tSamp;
    int iRet;

    while (1)
    {
        iRet = ts_read(g_tTSDev, &tSamp, 1);
        if (iRet == 1)
        {
            ptInputEvent->tTime = tSamp.tv;
            ptInputEvent->iType = INPUT_TYPE_TOUCHSCREEN;
            ptInputEvent->iX = tSamp.x;
            ptInputEvent->iY = tSamp.y;
            ptInputEvent->iPressure = tSamp.pressure;
            return 0;
        }
        else
        {
            return -1;
        }
    }

    return 0;
}

static int TouchScreenGetInputEvent(void)
{
    struct ts_sample tSamp;
    int iRet;

    iRet = ts_read(g_tTSDev, &tSamp, 1);
    if (iRet < 0) // 读取失败就返回-1
        return -1;

    // 处理数据
    if (isOutOf500ms(&tPreTime, &tSamp.tv))
    {
        // 时间间隔太短的数据不处理
        tPreTime = tSamp.tv;
        PT_InputEvent->tTime = tSamp.tv;
        PT_InputEvent->iType = INPUT_TYPE_TOUCHSCREEN;

        if (tSamp.y < giYres / 3)
        {
            ptInputEvent.iVal = INPUT_VALUE_UP;
        }
        else if (tSamp.y > 2 * giYres / 3)
        {
            ptInputEvent.iVal = INPUT_VALUE_DOWN;
        }
        else
        {
            PT_InputEvent.iVal = INPUT_VALUE_UNKNOWN;
        }
        return 0;
    }
    else
    {
        return -1;
    }

    return 0;
}

static T_InputOpr g_tTouchScreenOpr = {
    .name = "touchscreen",
    .DeviceInit = TouchScreenDevInit,
    .DeviceExit = TouchScreenDevExit,
    .GetInputEvent = TouchScreenGetInputEvent,
};

//  * 函数名称： TouchScreenInit
//  * 功能描述： 注册"触摸屏输入模块"
//  * 输入参数： 无
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
int TouchScreenDevInit(void)
{
    return RegisterInputOpr(&g_tTouchScreenOpr);
}
